Semantic Search
contents
시맨틱 검색(Semantic Search)(벡터 임베딩 기반)은 컴퓨터가 텍스트를 "읽는" 방식을 근본적으로 바꿈으로써 동의어 문제를 해결합니다. 글자를 매칭하는 대신 의미를 매칭하는 방식입니다.
다음은 이 기술이 어떻게 작동하는지에 대한 분석입니다.
1. 핵심 개념: 좌표로서의 단어 (Words as Coordinates) 📍
키워드 검색에서 "Laptop(랩탑)"은 단순히 6글자로 된 문자열(L-a-p-t-o-p)일 뿐입니다.
시맨틱 검색에서 "Laptop"은 벡터(Vector), 즉 긴 숫자 리스트(좌표)로 변환됩니다.
- 키워드 표현: "Laptop" = ID #4592
- 벡터 표현: "Laptop" =
[0.12, -0.98, 0.55, 0.23, ...]
이 숫자 리스트는 다차원의 "의미 공간(Meaning Space)"(또는 잠재 공간)에서 해당 단어의 위치를 나타냅니다.
2. 의미의 "지도" (임베딩 공간) 🗺️
사전에 있는 모든 단어가 하나의 점으로 찍혀 있는 거대한 3차원 지도를 상상해 보세요.
이 지도의 규칙은 간단합니다: 비슷한 의미를 가진 단어들은 서로 가깝게 배치된다.
- 학습: AI 모델(BERT나 Word2Vec 등)은 수십억 개의 문장을 읽습니다. 그리고 "Laptop"과 "Notebook"이라는 단어가 자주 같은 문맥에서 등장한다는 것을 알아차립니다(예: "나는 으로 타이핑했다", " 의 화면이 깨졌다").
- 결과: 모델은 이 두 단어가 관련이 있다는 것을 학습하고, 이들에게 수치적으로 매우 유사한 벡터 좌표를 부여합니다.
3. 동의어 문제 해결 🤝
이것이 바로 키워드 검색이 실패하는 지점을 해결하는 원리입니다.
시나리오: 사용자가 "Cheap Notebook(저렴한 노트북)"을 검색함
A. 키워드 검색 (실패)
- 사용자 검색어: "Cheap Notebook"
- 문서 A: "Affordable Laptop for sale." (저렴한 랩탑 팝니다.)
- 결과: 매칭 안 됨.
- 이유: 문서 A에는 "Notebook"이라는 문자열이 존재하지 않습니다. 엔진은 겹치는 글자가 없다고 판단합니다.
B. 시맨틱 검색 (해결)
- 검색어 벡터화: 엔진은 "Cheap Notebook"을 벡터 좌표로 변환합니다:
[0.85, 0.10, ...] - 문서 벡터화: 엔진은 이미 문서 A("Affordable Laptop")를 벡터로 변환해 두었습니다:
[0.84, 0.11, ...] - 거리 측정: 엔진은 이 두 벡터 사이의 거리(또는 각도)를 계산합니다.
- 결과: 매칭 성공!
- 이유: 단어(글자)는 다르지만, 의미 공간상에서 그들의 좌표 가 거의 일치하기 때문입니다. 수학적 거리가 가깝기 때문에 엔진은 이들이 관련 있다고 판단합니다.
4. 수학적 원리: 코사인 유사도 (Cosine Similarity) 📐
컴퓨터는 두 벡터가 가깝다는 것을 어떻게 알까요? 보통은 직선 거리(유클리드 거리)를 재지 않고, 두 벡터 사이의 각도를 측정합니다. 이를 코사인 유사도라고 합니다.
- 두 벡터가 정확히 같은 방향을 가리키면 (각도 $0^\circ$), 유사도 = 1 (의미가 동일함).
- 정반대 방향을 가리키면 (각도 $180^\circ$), 유사도 = -1 (의미가 반대임).
- 직각을 이루면 (각도 $90^\circ$), 유사도 = 0 (관련 없음).
예시:
- 검색어 벡터 ("Phone"):
[0.9, 0.1] - 문서 A 벡터 ("Cellphone"):
[0.89, 0.12]$\rightarrow$ 각도가 매우 좁음 (높은 점수) - 문서 B 벡터 ("Banana"):
[0.1, 0.9]$\rightarrow$ 각도가 큼 (낮은 점수)
5. 동의어를 넘어: "문맥적" 의미 (Contextual Meanings) 🧠
과거의 벡터 모델(Word2Vec 등)은 각 단어에 하나의 고정된 벡터를 부여했습니다.
최신 모델(Transformer/LLM)은 문맥적 임베딩(Contextual Embeddings) 을 생성합니다. 이는 더 어려운 문제를 해결합니다.
예시: 단어 "Bank" (은행 vs 강둑)
- "I sat on the river bank." (나는 강 둑에 앉았다.)
- "I went to the bank to deposit money." (나는 돈을 예금하러 은행에 갔다.)
- 키워드 검색: 두 문장의 "bank"를 똑같은 단어로 봅니다.
- 고정 벡터: "bank"에 대해 하나의 평균적인 벡터를 가집니다 (강둑과 돈의 의미가 섞임).
- 문맥적 시맨틱 검색:
- 1번 문장에서 "bank"는 "자연", "물", "풀"과 가까운 벡터를 받습니다.
- 2번 문장에서 "bank"는 "금융", "돈", "ATM"과 가까운 벡터를 받습니다.
이를 통해 "금융 기관"을 검색했을 때, "bank"라는 단어가 포함되어 있더라도 낚시터(강둑)에 대한 결과는 제외할 수 있게 됩니다.
요약
| 특징 | 키워드 검색 | 시맨틱 검색 (벡터) |
|---|---|---|
| 매칭 방법 | 정확한 글자 겹침 (Exact character overlap). | 공간상의 수학적 근접성 (Proximity). |
| "Notebook" vs "Laptop" | 매칭 실패 (글자가 다름). | 매칭 성공 (벡터가 가까움). |
| "Bank"(돈) vs "Bank"(강) | 혼동함 (다의성 문제). | 문맥(Context)을 통해 구별함. |
| 비유 | 문서에서 "Ctrl+F" 사용하기. | 개념을 이해하는 사서에게 물어보기. |
references